package org.wdcode.core.tools;

import java.io.OutputStream;
import java.util.Map;

import org.wdcode.common.util.CloseUtil;
import org.wdcode.core.xml.Document;
import org.wdcode.core.xml.Element;
import org.wdcode.core.xml.XMLFactory;
import org.wdcode.core.xml.output.Format;
import org.wdcode.core.xml.output.XMLWrite;

/**
 * 向指定流中输出XML 一般用于向前台发送XML,AJAX用<br/>
 * <h2>注: 本类的XML实现是org.wdcode.core.xml具体请参看相关信息</h2>
 * @author WD
 * @since JDK6
 * @version 1.0 2009-03-18
 */
public class ExportXML {
	/**
	 * 向OutputStream输出XML,Map中包含节点name和value 如果Map为空怎返回不做操作
	 * @param out 输出流
	 * @param data 包含要输出的XML数据
	 * @throws CustomException 输出XML错误
	 */
	public final static void exportXML(OutputStream out, Map<String, String> data) {
		// 获得Document
		Document doc = createDocument();
		// 获得根节点
		Element root = doc.getRootElement();
		// 循环Map
		for (Map.Entry<String, String> entry : data.entrySet()) {
			root.addElement(entry.getKey(), entry.getValue());
		}
		// 输出XML
		writeXml(out, doc);
	}

	/**
	 * 往OutputStream中输出XML,String[][]中包含节点name和value 如果Map为空怎返回不做操作 <h2>注:
	 * String[][]格式必须为String[][2] 它的String[][0]为name,String[][1]为value</h2>
	 * @param out 要输出XML的流
	 * @param data 输出的XML信息，二维数组，包含key与value
	 * @throws 输出XML错误
	 */
	public final static void exportXML(OutputStream out, String[][] data) {
		// 获得Document
		Document doc = createDocument();
		// 获得根节点
		Element root = doc.getRootElement();
		// 循环添加节点
		for (int i = 0; i < data.length; i++) {
			root.addElement(data[i][0], data[i][1]);
		}
		// 输出XML
		writeXml(out, doc);
	}

	/**
	 * 创建Document
	 * @return
	 */
	protected final static Document createDocument() {
		// 创建空白文档
		Document doc = XMLFactory.createDocument();
		// 创建一个元素 将该元素做为根元素
		doc.setRootElement(XMLFactory.createElement());
		// 返回Document
		return doc;
	}

	/**
	 * 写XML
	 * @param out
	 * @param root
	 */
	protected final static void writeXml(OutputStream out, Document doc) {
		// 声明XMLWrite
		XMLWrite writer = null;
		try {
			// 格式化文档
			Format format = XMLFactory.createFormat();
			// 用于输出XML 文档
			writer = XMLFactory.createXMLOutput(format);
			// 写XML 输出文档
			writer.output(doc, out);
		} finally {
			// 关闭流
			CloseUtil.close(out);
			// 关闭写入器
			writer.close();
		}
	}

	/**
	 * 受保护的构造，禁止外部实例化
	 */
	protected ExportXML() {}
}
